#include "my_lib/led.h"


static uint8_t gLedBit =0xff;
static LedType gLeds[1];


static void LedBitCtrl(uint8_t LedNum, uint8_t LedSta)
{
    if(LedSta){
        gLedBit |= 1<<(LedNum);
    }else{
        gLedBit &= ~(1<<(LedNum));
    }

    // HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, gLedBit&(1<<0));
    GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PINS, gLedBit&(1<<0));
}

void LedSetParam(uint8_t LedNum, LedSta_Enum LedSta, uint16_t Tick)
{
    gLeds[LedNum].sta = LedSta;
    gLeds[LedNum].tick = Tick;
    gLeds[LedNum].LastChangeTick = GetTick();
    gLeds[LedNum].LastLevel = 0;
}

void LedInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    __RCC_GPIOC_CLK_ENABLE();

    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = LED0_GPIO_PINS;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

    GPIO_Init(LED0_GPIO_PORT, &GPIO_InitStruct);

    LedSetParam(0, LedOnOff, 500);
}

void LedTask_Handler(uint16_t cycle_tick)
{
    static uint32_t time_tick = 0;
    if((GetTick()-time_tick) > cycle_tick)
    {
        time_tick = GetTick();
        for(uint8_t i=0; i<3; i++)
        {
            switch (gLeds[i].sta)
            {
            case LedOff:
                LedBitCtrl(i, 1);
                break;
            case LedOn:
                LedBitCtrl(i, 0);
                break;
            case LedOnOff:
                if((GetTick()-gLeds[i].LastChangeTick) > gLeds[i].tick)
                {
                    gLeds[i].LastChangeTick = GetTick();
                    gLeds[i].LastLevel = ~gLeds[i].LastLevel;
                    LedBitCtrl(i, gLeds[i].LastLevel);
                }
                break;
            
            default:
                break;
            }
        }
    }
}

